package com.blunka.framework.client.db.druid.dbutils;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.sql.DataSource;

import com.blunka.framework.client.db.entity.BatchSqlEntity;

public interface IServiceDbHelper {

	/**
	 * 初始化数据库连接
	 * @param p
	 * @throws Exception
	 */
	public void initDataSource(Properties p)throws Exception;

	/**
	 * 获取数据源
	 * @return 数据源对象
	 */
	public DataSource getDataSource();

	/**
	 * 取得数据库连接
	 * @return 数据库连接对象
	 */
	public Connection getConn();

	/**
	 * 释放数据库连接
	 * @param conn 要释放的数据库连接
	 */
	public void closeConn(Connection conn);

    /**
     * 执行 SELECT 语句，返回单条查询结果为Map对象
     *
     * @param sql 即将被执行的sql语句.
     * @return 返回Map对象，出错则返回null
     */
    public Map<String, String> getItemMap(String sql);

    /**
     * 带入指定的参数对象，执行 SELECT 语句，返回单条查询结果为Map对象
     *
     * @param sql 即将被执行的sql语句.
     * @param param 参数对象.
     * @return 返回Map对象，出错则返回null
     */
    public Map<String, String> getItemMap(String sql, Object param);

    /**
     * 带入指定的参数数组，执行 SELECT 语句，返回单条查询结果为Map对象
     *
     * @param sql 即将被执行的sql语句.
     * @param params 参数数组.
     * @return 返回Map对象，出错则返回null
     */
    public Map<String, String> getItemMap(String sql, Object... params);

    /**
     * 带入指定的参数对象，执行 SELECT 语句，并把查询结果返回为字符串数组列表
     *
     * @param sql 即将被执行的sql语句.
     * @param param 参数对象.
     * @return 返回字符串数组的列表，出错则返回空列表
     */
    public List<String[]> getArrayList(String sql, Object param)throws SQLException;

    /**
     * 带入指定的参数数组，执行 SELECT 语句，并把查询结果返回为字符串数组列表
     *
     * @param sql 即将被执行的sql语句.
     * @param params 参数数组.
     * @return 返回字符串数组的列表，出错则返回空列表
     */
    public List<String[]> getArrayList(String sql, Object... params)throws SQLException;

    /**
     * 带入指定的参数数组，执行 INSERT, UPDATE, 或者 DELETE 语句
     *
     * @param sql 即将被执行的sql语句.
     * @param params 参数数组.
     * @return 影响的行数，-1表示出错
     */
    public int[] batch(String sql, List<Object[]> params);

    /**
    *
    * @param entity
    * @return 批量处理sql
    * @throws Exception
    */
   public int[] batch(List<BatchSqlEntity> entity)throws Exception;

   /**
    * 批量执行sql
    * @param sql
    * @return
    * @throws Exception
    */
   public int[] batch(ArrayList<String> sql)throws Exception;

   /**
    * 执行 SELECT 语句，并把查询结果返回为Map列表
    *
    * @param sql 即将被执行的sql语句.
    * @return 返回Map的列表，出错则返回空列表
    */
   public List<Map<String, String>> getMapList(String sql);

   /**
    * 带入指定的参数对象，执行 SELECT 语句，并把查询结果返回为Map列表
    *
    * @param sql 即将被执行的sql语句.
    * @param param 参数对象.
    * @return 返回Map的列表，出错则返回空列表
    */
   public List<Map<String, String>> getMapList(String sql, Object param);

   /**
    * 带入指定的参数数组，执行 SELECT 语句，并把查询结果返回为Map列表
    *
    * @param sql 即将被执行的sql语句.
    * @param params 参数数组.
    * @return 返回Map的列表，出错则返回空列表
    */
   public List<Map<String, String>> getMapList(String sql, Object... params);

   /**
    * 执行 SELECT 语句，并把查询结果返回为字符串数组列表
    *
    * @param sql 即将被执行的sql语句.
    * @return 返回字符串数组的列表，出错则返回空列表
    */
   public List<String[]> getArrayList(String sql)throws SQLException ;

   /**
    * 执行 INSERT, UPDATE, 或者 DELETE 语句
    *
    * @param sql 即将被执行的sql语句.
    * @return 影响的行数，-1表示出错
    */
   public int execute(String sql);

   /**
    * 带入指定的参数对象，执行 INSERT, UPDATE, 或者 DELETE 语句
    *
    * @param sql 即将被执行的sql语句.
    * @param param 参数对象.
    * @return 影响的行数，-1表示出错
    */
   public int execute(String sql, Object param);

   /**
    * 带入指定的参数数组，执行 INSERT, UPDATE, 或者 DELETE 语句
    *
    * @param sql 即将被执行的sql语句.
    * @param params 参数数组.
    * @return 影响的行数，-1表示出错
    */
   public int execute(String sql, Object... params);

   /**
    * 给定SQL和指定的类，就可以返回一个对象（如果结果集有多行，则只返回首行）。
 * @param <T>
    *
    * @param sql 即将被执行的sql语句.
    * @param type 指定类
    * @return 获取的对象.(如果结果集为空，则返回null)
    */
   public <T> T getBean(String sql, Class<T> type);

   /**
    * 给定SQL和指定的类，就可以返回一个对象（如果结果集有多行，则只返回首行）。
    * @param sql 即将被执行的sql语句.
    * @param type 指定类
    * @param param 参数
    * @return 获取的对象.(如果结果集为空，则返回null)
    */
   public <T> T getBean(String sql, Class<T> type, Object param);

   /**
    * 给定SQL和指定的类，就可以返回一个对象（如果结果集有多行，则只返回首行）。
    * @param sql 即将被执行的sql语句.
    * @param type 指定类
    * @param params 参数数组
    * @return 获取的对象.(如果结果集为空，则返回null)
    */
   public <T> T getBean(String sql, Class<T> type, Object... params);

   /**
    * 给定SQL和指定的类，就可以返回一个对象列表
    * @param sql 即将被执行的sql语句.
    * @param type 指定类
    * @param params 参数数组
    * @return 获取的对象列表.(如果结果集为空，则返回null)
    */
   public <T> List<T> getBeanList(String sql, Class<T> type, Object... params);

   /**
    * 给定SQL和指定的类，就可以返回一个对象列表
    *
    * @param sql 即将被执行的sql语句.
    * @param type 指定类
    * @return 获取的对象列表.(如果结果集为空，则返回长度为0的list)
    */
   public <T> List<T> getBeanList(String sql, Class<T> type);

   /**
    * 给定SQL和指定的类，就可以返回一个对象列表
    * @param sql 即将被执行的sql语句.
    * @param type 指定类
    * @param param 查询参数
    * @return 获取的对象列表.(如果结果集为空，则返回长度为0的list)
    */
   public <T> List<T> getBeanList(String sql, Class<T> type, Object param);

}
